more work
authorHavoc Pennington <hp@redhat.com>
Thu, 21 Dec 2000 22:17:38 +0000 (22:17 +0000)
committerHavoc Pennington <hp@src.gnome.org>
Thu, 21 Dec 2000 22:17:38 +0000 (22:17 +0000)
2000-12-21  Havoc Pennington  <hp@redhat.com>

* tests/testtreeview.c: more work

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
tests/testtreeview.c

index 0a40f44819e88af12aca3f62b2dfef7b61da56dd..72e1251f791f8659d71cd1c68aee327f65451962 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2000-12-21  Havoc Pennington  <hp@redhat.com>
+
+       * tests/testtreeview.c: more work
+
 2000-12-21  Alexander Larsson  <alexl@redhat.com>
 
        * docs/README.linux-fb:
index 0a40f44819e88af12aca3f62b2dfef7b61da56dd..72e1251f791f8659d71cd1c68aee327f65451962 100644 (file)
@@ -1,3 +1,7 @@
+2000-12-21  Havoc Pennington  <hp@redhat.com>
+
+       * tests/testtreeview.c: more work
+
 2000-12-21  Alexander Larsson  <alexl@redhat.com>
 
        * docs/README.linux-fb:
index 0a40f44819e88af12aca3f62b2dfef7b61da56dd..72e1251f791f8659d71cd1c68aee327f65451962 100644 (file)
@@ -1,3 +1,7 @@
+2000-12-21  Havoc Pennington  <hp@redhat.com>
+
+       * tests/testtreeview.c: more work
+
 2000-12-21  Alexander Larsson  <alexl@redhat.com>
 
        * docs/README.linux-fb:
index 0a40f44819e88af12aca3f62b2dfef7b61da56dd..72e1251f791f8659d71cd1c68aee327f65451962 100644 (file)
@@ -1,3 +1,7 @@
+2000-12-21  Havoc Pennington  <hp@redhat.com>
+
+       * tests/testtreeview.c: more work
+
 2000-12-21  Alexander Larsson  <alexl@redhat.com>
 
        * docs/README.linux-fb:
index 0a40f44819e88af12aca3f62b2dfef7b61da56dd..72e1251f791f8659d71cd1c68aee327f65451962 100644 (file)
@@ -1,3 +1,7 @@
+2000-12-21  Havoc Pennington  <hp@redhat.com>
+
+       * tests/testtreeview.c: more work
+
 2000-12-21  Alexander Larsson  <alexl@redhat.com>
 
        * docs/README.linux-fb:
index 0a40f44819e88af12aca3f62b2dfef7b61da56dd..72e1251f791f8659d71cd1c68aee327f65451962 100644 (file)
@@ -1,3 +1,7 @@
+2000-12-21  Havoc Pennington  <hp@redhat.com>
+
+       * tests/testtreeview.c: more work
+
 2000-12-21  Alexander Larsson  <alexl@redhat.com>
 
        * docs/README.linux-fb:
index 0a40f44819e88af12aca3f62b2dfef7b61da56dd..72e1251f791f8659d71cd1c68aee327f65451962 100644 (file)
@@ -1,3 +1,7 @@
+2000-12-21  Havoc Pennington  <hp@redhat.com>
+
+       * tests/testtreeview.c: more work
+
 2000-12-21  Alexander Larsson  <alexl@redhat.com>
 
        * docs/README.linux-fb:
index 9b2d9183a2401c77a1c97a7bb9307775638b36e5..ce0f3ccb00fc8bfa0a5fba26b936378f29224900 100644 (file)
@@ -1,5 +1,7 @@
 
 #include <gtk/gtk.h>
+#include <string.h>
+
 
 static void
 get_param_specs (GObject *object,
@@ -26,6 +28,45 @@ g_object_connect_property (GObject *object,
   g_free (with_detail);
 }
 
+typedef struct 
+{
+  GObject *obj;
+  gchar *prop;
+} ObjectProperty;
+
+static void
+free_object_property (ObjectProperty *p)
+{
+  g_free (p->prop);
+  g_free (p);
+}
+
+static void
+connect_controller (GObject *controller,
+                    const gchar *signal,
+                    GObject *model,
+                    const gchar *prop_name,
+                    GtkSignalFunc func)
+{
+  ObjectProperty *p;
+
+  p = g_new (ObjectProperty, 1);
+  p->obj = model;
+  p->prop = g_strdup (prop_name);
+
+  g_signal_connect_data (controller, signal, func, p,
+                         (GDestroyNotify)free_object_property,
+                         FALSE, FALSE);
+}
+
+static void
+int_modified (GtkAdjustment *adj, gpointer data)
+{
+  ObjectProperty *p = data;
+
+  g_object_set (p->obj, p->prop, (int) adj->value, NULL);
+}
+
 static void
 int_changed (GObject *object, GParamSpec *pspec, gpointer data)
 {
@@ -34,27 +75,55 @@ int_changed (GObject *object, GParamSpec *pspec, gpointer data)
 
   g_value_init (&val, G_TYPE_INT);
   g_object_get_property (object, pspec->name, &val);
-  
-  gtk_adjustment_set_value (adj, g_value_get_int (&val));
+
+  if (g_value_get_int (&val) != (int)adj->value)
+    gtk_adjustment_set_value (adj, g_value_get_int (&val));
+
   g_value_unset (&val);
 }
 
+
+static void
+string_modified (GtkEntry *entry, gpointer data)
+{
+  ObjectProperty *p = data;
+  gchar *text;
+
+  text = gtk_entry_get_text (entry);
+
+  g_object_set (p->obj, p->prop, text, NULL);
+}
+
 static void
 string_changed (GObject *object, GParamSpec *pspec, gpointer data)
 {
   GtkEntry *entry = GTK_ENTRY (data);
   GValue val = { 0, };  
   gchar *str;
+  gchar *text;
   
   g_value_init (&val, G_TYPE_STRING);
   g_object_get_property (object, pspec->name, &val);
 
   str = g_value_get_string (&val);
+  if (str == NULL)
+    str = "";
+  text = gtk_entry_get_text (entry);
+
+  if (strcmp (str, text) != 0)
+    gtk_entry_set_text (entry, str);
   
-  gtk_entry_set_text (entry, str ? str : "");
   g_value_unset (&val);
 }
 
+static void
+bool_modified (GtkToggleButton *tb, gpointer data)
+{
+  ObjectProperty *p = data;
+
+  g_object_set (p->obj, p->prop, (int) tb->active, NULL);
+}
+
 static void
 bool_changed (GObject *object, GParamSpec *pspec, gpointer data)
 {
@@ -64,8 +133,9 @@ bool_changed (GObject *object, GParamSpec *pspec, gpointer data)
   g_value_init (&val, G_TYPE_BOOLEAN);
   g_object_get_property (object, pspec->name, &val);
 
-  gtk_toggle_button_set_active (tb, g_value_get_boolean (&val));
-  
+  if (g_value_get_boolean (&val) != tb->active)
+    gtk_toggle_button_set_active (tb, g_value_get_boolean (&val));
+
   gtk_label_set_text (GTK_LABEL (GTK_BIN (tb)->child), g_value_get_boolean (&val) ?
                       "TRUE" : "FALSE");
   
@@ -85,8 +155,13 @@ create_prop_editor (GObject *object)
   GParamSpec **specs = NULL;
   gint i;
   GtkAdjustment *adj;
-
+  
   win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+  /* hold a strong ref to the object we're editing */
+  g_object_ref (G_OBJECT (object));
+  g_object_set_data_full (G_OBJECT (win), "model-object",
+                          object, (GDestroyNotify)g_object_unref);
   
   vbox = gtk_vbox_new (TRUE, 2);
 
@@ -103,8 +178,12 @@ create_prop_editor (GObject *object)
   while (i < n_specs)
     {
       GParamSpec *spec = specs[i];
-
+      gboolean can_modify;
+      
       prop_edit = NULL;
+
+      can_modify = ((spec->flags & G_PARAM_WRITABLE) != 0 &&
+                    (spec->flags & G_PARAM_CONSTRUCT_ONLY) == 0);
       
       if ((spec->flags & G_PARAM_READABLE) == 0)
         {
@@ -136,6 +215,10 @@ create_prop_editor (GObject *object)
           g_object_connect_property (object, spec->name,
                                      GTK_SIGNAL_FUNC (int_changed),
                                      adj);
+
+          if (can_modify)
+            connect_controller (G_OBJECT (adj), "value_changed",
+                                object, spec->name, (GtkSignalFunc) int_modified);
           break;
 
         case G_TYPE_STRING:
@@ -152,6 +235,10 @@ create_prop_editor (GObject *object)
           g_object_connect_property (object, spec->name,
                                      GTK_SIGNAL_FUNC (string_changed),
                                      prop_edit);
+
+          if (can_modify)
+            connect_controller (G_OBJECT (prop_edit), "changed",
+                                object, spec->name, (GtkSignalFunc) string_modified);
           break;
 
         case G_TYPE_BOOLEAN:
@@ -168,17 +255,29 @@ create_prop_editor (GObject *object)
           g_object_connect_property (object, spec->name,
                                      GTK_SIGNAL_FUNC (bool_changed),
                                      prop_edit);
+
+          if (can_modify)
+            connect_controller (G_OBJECT (prop_edit), "toggled",
+                                object, spec->name, (GtkSignalFunc) bool_modified);
           break;
 
         default:
+          {
+            gchar *msg = g_strdup_printf ("%s: don't know how to edit type %s",
+                                          spec->nick, g_type_name (spec->value_type));
+            hbox = gtk_hbox_new (FALSE, 10);
+            label = gtk_label_new (msg);            
+            g_free (msg);
+            gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+            gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+            gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+          }
           break;
         }
 
       if (prop_edit)
         {
-          /* make insensitive if the property isn't writable */
-          if ((spec->flags & G_PARAM_WRITABLE) == 0 ||
-              (spec->flags & G_PARAM_CONSTRUCT_ONLY) != 0)
+          if (!can_modify)
             gtk_widget_set_sensitive (prop_edit, FALSE);
           
           /* set initial value */